<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      //一.new干了什么
      /*
      1.创建一个空的简单JavaScript对象{}
      2.为步骤1新创建的对象添加属性__proto__,该属性链接至构造函数的原型对象
      3.步骤1新创建的对象作为this的上下文
      4.如果该函数没有返回对象  则返回this
      */

      //二.仿写一个new
      /*
      1.创建一个空对象
      2.把构造函数的显示原型赋值给这个空对象的隐式原型
      3.把创建的这个对象改成构造函数里的this
      4.看构造函数里是否有对象返还值 ,如果有,那么自动返还这个对象,如果没有返还值那么就返还构造函数里的this(就是第一步创建的这个空对象)
      */

      function myNew(fn, ...args) {
        //第一步
        var obj = {};
        //第二步
        //prototype: 显示原型  __proto__隐式原型
        obj.__proto__ = Fn.__proto__;
        //第三步
        var res = Fn.call(obj, ...args);
        //第四步
        if (typeof res === "object") {
          return res;
        } else {
          return obj;
        }
      }

      //
      function Person(name) {
        this.name = name;
        //return this //隐式返还this
        //return {name:"123"}
      }
      Person.prototype.fn = function () {
        console.log("fn");
      };

      var zhangsan = myNew(Person, "张三");
      console.log(zhangsan);
      zhangsan.fn();

      //var zhangsan =new Person("张三")
      //console.log(zhangsan)

      //Person.prototype 显示原型

      //var zhangsan = new Person("张三")

      //zhangsan.__proto__
      console.log(Person.prototype === zhangsan.__proto__);
    </script>
  </body>
</html>
